package com.asiainfo.iam.tool;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 用于将msgId存入redis，这样当发生消息重试的时候，可以忽略已经处理过的消息
 */
@Component
public class RedisMsgIdUtil {
    private static final String MSG_PROCESSED_KEY = "mq:processed:";  // 消息处理状态前缀
    private static final String MSG_LOCK_KEY = "mq:lock:";            // 消息处理锁前缀
    private static final String MSG_DATA_KEY = "mq:data:";  // 消息处理状态前缀

    private static final long MSG_ID_EXPIRE_TIME = 24 * 60 *60;   //TTL 24小时
    private static final long MSG_DATA_EXPIRE_TIME = 60 *60;   //TTL 24小时

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 判断消息是否处理过
     */
    public boolean isMessageProcessed(String msgId) {
        return redisTemplate.opsForValue().get(MSG_PROCESSED_KEY + msgId) != null;
    }

    /**
     * 标记消息已经处理set
     */
    public void markMessageProcessed(String msgId){
        redisTemplate.opsForValue().setIfAbsent(//修改为setIfAbsent
                MSG_PROCESSED_KEY+msgId,
                "processed",
                MSG_ID_EXPIRE_TIME,
                TimeUnit.SECONDS);
    }
    /**
     * 优化--将 “检查 + 标记” 改为原子操作，利用 Redis 的SETNX（若不存在则设置）命令，确保同一 消息体 只有一个线程能处理。
     */
    public boolean  checkAndMarkMessageProcessed(String bodyHash){
        return redisTemplate.opsForValue().setIfAbsent(//修改为setIfAbsent
                MSG_DATA_KEY+bodyHash,
                "data",
                MSG_DATA_EXPIRE_TIME,
                TimeUnit.SECONDS);
    }

}
